package com.gxy.learn.design.principle.liskov_substitution_principle;

import lombok.extern.slf4j.Slf4j;

/**
 * @description: 里氏代换原则
 *
 * 里氏代换原则：任何基类可以出现的地方，子类一定可以出现。通俗理解：子类可以扩展父类的功能，但不能改变父类原有的功能。换句
 * 话说，子类继承父奏时，除添加新的方法完成新增功能外，尽量不要重写父类的方法。
 * 如果通过重写父类的方法来完成新的功能，这样写起来虽然简单大 但是整个继承体系的可复用性会比较差，特别是运用多态比较频繁时，
 * 程序运行出错的概率会非常大。
 * 例子：正方形是四边形
 * @author: gaoxueyong
 * @Date: 2022/11/6 13:43
 */
@Slf4j
public class LiskovSubstitutionPrincipleClient {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(20,10);
        resize(rectangle);
        printLengthAndWidth(rectangle);
        printLengthAndWidth(new Square(20));
    }

    /**
     * 扩宽
     * @Author gaoxueyong
     * @Date 1:46 下午 2022/11/6
     * @Param [rectangle]
     * @return void
     **/
    public static void resize(Rectangle rectangle){
        while (rectangle.getWidth()<= rectangle.getLength()){
            rectangle.setWidth(rectangle.getWith()+1);
        }

    }

    /**
     * 打印
     * @Author gaoxueyong
     * @Date 1:46 下午 2022/11/6
     * @Param [quadrilateral]
     * @return void
     **/
    public static void printLengthAndWidth(Quadrilateral quadrilateral){
        log.info("length = {},width = {}",quadrilateral.getLength(),quadrilateral.getWith());
    }
}
